package 找到字符串中所有的字母异位词;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

//给定两个字符串 s 和 p，找到 s 中所有 p 的
//异位词
// 的子串，返回这些子串的起始索引。不考虑答案输出的顺序。
//输入: s = "cbaebabacd", p = "abc"
//输出: [0,6]
//解释:
//起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。
//起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。
public class Solution
{
    public List<Integer> findAnagrams(String s, String p) {
        //滑动窗口，笨办法，一格一格的滑动，每个新的子串都跟p对比

        //异位词就使用词频

        ArrayList<Integer> list = new ArrayList<>();

        if (s.length()<p.length())
            return list;

        int[] scount=new int[26];
        int[] pcount=new int[26];

        for (int i = 0; i < p.length(); i++)
        {
            scount[s.charAt(i)-'a']++;
            pcount[p.charAt(i)-'a']++;
        }
        if (Arrays.equals(scount,pcount))
            list.add(0);
        //窗口进行滑动
        for (int i = 0; i < s.length()-p.length(); i++)
        {
            //要减少过去一位的词频
            --scount[s.charAt(i)-'a'];
            //要增加过来一位的词频
            ++scount[s.charAt(i+p.length())-'a'];
            //滑动后判断
            if (Arrays.equals(scount,pcount))
                list.add(i+1);

        }
        return list;
    }
}
